Spring Framework の IoC コンテナ
Spring Framework のコア機能のひとつ、IoC コンテナ (DI コンテナ) について
参照文書 : https://docs.spring.io/spring-framework/docs/current/reference/html/core.html
IoC 原則の Spring Framework の実装
以下のパッケージが Spring Framework の IoC コンテナの基礎
org.springframework.beans パッケージ
org.springframework.context パッケージ
BeanFactory インターフェイスが進歩的な設定機構を提供 (基本機能)
ApplicationContext は BeanFactory のサブインターフェイス (エンタープライズ向け機能を追加)
Bean
Bean とは?
アプリケーションの背骨を形作る
Spring IoC コンテナによって管理される
インスタンス化や組立てを Spring IoC コンテナが担う
from Spring 徹底入門 Spring Framework による Java アプリケーション開発
依存注入 (DI) は、制御の反転の原則 (Inversion of Control Principle) を実現する
Spring Framework では ApplicationContext が IoC コンテナの役割を担う
インジェクションの種類
セッターインジェクション
コンストラクタインジェクション
フィールドインジェクション
オートワイヤリング
2 種類
型による解決 : @Autowired
名前による解決
コンポーネントスキャン : 特定のアノテーションがついたクラスが DI コンテナに登録される
Java Config の場合は @ComponentScan アノテーション
コンポーネントスキャンの対象クラスをフィルタで明示できる
DI コンテナを利用するメリットのひとつは、Bean の生存期間 (スコープ) の管理を任せられること
@LookUp アノテーションでルックアップインジェクションが可能
nobuoka.icon インジェクション先のスコープに縛られずにインスタンスを取得する場合に使用できると本書では書かれているが、その場合は Factory クラスをつくるとかした方が良い気がするな?
Scoped Proxy というのもある
Post Construct や Pre Destroy といった拡張ポイントがある
JSR 330 の API も使用できる
from Spring Boot 2 入門 ― 基礎から実演まで
Spring では IoC コンテナを ApplicationContext インターフェイスで表現
IoC コンテナで管理されるオブジェクトを Bean という
from Spring 解体新書 第 2 版
Spring の DI では以下のことが行われる
依存オブジェクトの注入
1. DI の対象クラスを探す
Spring の起動時に DI の対象となるクラスを探す (コンポーネントスキャン)
特定のアノテーションがついたクラスを探す
2. @Autowired アノテーションがついている箇所にインスタンスを注入
インスタンスのライフサイクル管理
インスタンスの生成と破棄
スコープをアノテーションで指定できる
デフォルトではシングルトン
DI コンテナに登録されるクラスを Bean という
以下のものが登録される
特定のアノテーションが付けられたクラス
JavaConfig での実装